package com.yonxao.demo.crud.core;


import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.ToString;

import java.io.Serializable;

import static com.yonxao.demo.crud.core.RetCodeEnum.SUCCESS;


/**
 * 返回数据类型
 *
 * @param <T> 数据类型
 * @author 刘锐
 * @date 2018/12/06 18:41
 */
@SuppressWarnings("unused")
@ApiModel("返回值")
@JsonInclude(JsonInclude.Include.NON_NULL)
@Getter
@ToString
public class Ret<T> implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 结果代码
     */
    @ApiModelProperty("结果代码")
    private int code;

    /**
     * 消息
     */
    @ApiModelProperty("消息")
    private String msg;

    /**
     * 消息
     */
    // @ApiModelProperty("消息2")
    // private String message;

    /**
     * 数据
     */
    @ApiModelProperty("数据")
    private T data;


    /**
     * 接口接到请求到返回数据花销的毫秒数
     */
    @ApiModelProperty("接口接到请求到返回数据花销的毫秒数")
    private long elapsed;


    /**
     * 构造函数
     */
    Ret() {
    }

    Ret(RetCode retCode) {
        this(retCode.getCode(), retCode.getMsg(), null);
    }

    Ret(int code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    public void setElapsed(long elapsed) {
        this.elapsed = elapsed;
    }

    /**
     * 是否成功
     *
     * @return 是否成功
     */
    @ApiModelProperty("是否成功")
    @JsonIgnore
    public boolean isSuccess() {
        return SUCCESS.getCode() == this.code;
    }

    /**
     * 是否失败
     *
     * @return 是否失败
     */
    @ApiModelProperty("是否失败")
    @JsonIgnore
    public boolean isFail() {
        return !isSuccess();
    }

    /**
     * 消息
     *
     * @return 消息
     */
    @ApiModelProperty("[*已废除*，请使用msg字段] 消息")
    public String getMessage() {
        return msg;
    }

    /**
     * 设置消息，仅仅是为了支持老版本的接口定义时可以反序列化
     *
     * @param message 消息
     */
    void setMessage(String message) {
        this.msg = message;
    }
}
